﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DataRecon;

namespace Lab2.IvanAndVorkos_dev.StringRecognition
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] days = { "понедельник", "вторник", "сред", "четверг", "пятниц", "суббот", "воскресенье" };
            string[] daysEng = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };
            string[] month = { "январ", "феврал", "март", "апрел", "ма", "июн", "июл", "август", "сентябр", "октябр", "ноябр", "декабр" };
            string[] transition = { "сегодня", "послезавтра", "завтра", "год", "лет" };
            int day = DateTime.Now.Day;     //используется?
            int mon = DateTime.Now.Month;   //используется?
            int year = DateTime.Now.Year;   //используется?
            Console.WriteLine("Введите строку");

            DateTime resultDate;//Промежуточная переменная для удобства
            string[] inputData = Parsing();//Ввод данных чуть выше чем раньше чтобы был доступ к массиву строк введенному и для других функций

            DateTime locDate = DateTime.Now;
            resultDate = Days(days, inputData, daysEng, transition, month) ?? DateTime.Now;//если нул вернула Days() то присвоить resultDate сегодняшнюю дату.
            resultDate = GetTime.FindTime(inputData, resultDate); //Добавить время к дате
            Console.WriteLine(resultDate);

             Console.ReadKey();
        }
     
        // метод для обработки дней недели
        public static DateTime? Days(string[] days, string[] result, string[] daysEng, string[] transition, string[] month)
        {
            DateTime locDate = DateTime.Now;
            for (int i = 0; i < result.Length; i++)
            {
                for (int j = 0; j < days.Length; j++)
                {
                    if (result[i].Contains(days[j]))
                    {
                        if (result[i - 1] == "на" || result[i - 1] == "в" || result[i - 1] == "во")
                        {
                            switch (j)
                            {
                                case 0:
                                    return CountDay(daysEng, 0);
                                case 1:
                                    return CountDay(daysEng, 1);
                                case 2:
                                    return CountDay(daysEng, 2);
                                case 3:
                                    return CountDay(daysEng, 3);
                                case 4:
                                    return CountDay(daysEng, 4);
                                case 5:
                                    return CountDay(daysEng, 5);
                                case 6:
                                    return CountDay(daysEng, 6);
                            }
                        }
                        else
                            continue;
                    }
                    else
                        continue;
                }
            }       
            return Transition(transition, result, month);
        }

        // метод для слов переходов типа завтра  и т.д.
        public static DateTime? Transition(string[] transition, string[] result, string[] month)
        {
            DateTime locDate = DateTime.Now;
            for (int i = 0; i < result.Length; i++)
            {
                for (int j = 0; j < transition.Length; j++)
                {
                    if (result[i].Contains(transition[j]))
                    {
                        switch (j)
                        {
                            case 0:
                                locDate = DateTime.Now;
                                return locDate;
                            case 1:
                                locDate = locDate.AddDays(2);
                                return locDate;
                            case 2:
                                locDate = locDate.AddDays(1);
                                return locDate;
                            case 3:
                                if (result[i - 1] == "через")
                                {
                                    locDate = locDate.AddYears(1);
                                    return locDate;
                                }
                                else
                                    if (result[i - 2] == "через" && IsInt(result[i - 1]))
                                        locDate = locDate.AddYears(Convert.ToInt32(result[i - 1]));
                                return locDate;
                            case 4:
                                if (result[i - 2] == "через" && IsInt(result[i - 1]))
                                    locDate = locDate.AddYears(Convert.ToInt32(result[i - 1]));
                                return locDate;
                        }
                    }
                }
            }
            return Months(month, result);
        }
    
        // метод для работы c месяцами
        public static DateTime? Months(string[] month, string[] result)
        {

            DateTime locDate = DateTime.Now;
            int _year = DateTime.Now.Year;
            int _month = DateTime.Now.Month; ;

            for (int i = 0; i < result.Length; i++)
            {
                for (int j = 0; j < month.Length; j++)
                    if (result[i].Contains(month[j]))
                    {
                        if (DateTime.Now.Month.ToString().Contains(month[j]))
                        {
                            if (IsInt(result[i - 1]))
                            {
                                string date = result[i - 1] + "." + _month + "." + _year;
                                locDate = Convert.ToDateTime(date);
                                return locDate;
                            }
                        }
                        else
                        {
                            if (j + 1 < DateTime.Now.Month)
                            {
                                _year = _year + 1;
                                _month = j + 1;
                                string date = result[i - 1] + "." + _month + "." + _year;
                                locDate = Convert.ToDateTime(date);
                                return locDate;
                            }
                            else
                            {
                                _month = j + 1;
                                string date = result[i - 1] + "." + _month + "." + _year;
                                locDate = Convert.ToDateTime(date);
                                return locDate;
                            }
                        }
                    }
            }
            Console.WriteLine("Вы не указали желаемое время выполнения заметки");
            return null;
        }
        // метод превращеня строки в массив слов
        public static string[] Parsing()
        {
            string input = Console.ReadLine();
            string[] result;
            result = input.Split(default(Char[]), StringSplitOptions.RemoveEmptyEntries);
            return result;
        }
        // проверка элемента массива на содерджание числа
        public static bool IsInt(string str)
        {
            bool flag = true;
            return flag;
        }
        // метод подсчета кол-ва дней от текущего до нужного
        public static DateTime CountDay(string[] daysEng, int masNumber)
        {
            int w = 0;
            DateTime locDate = DateTime.Now;
            string dayName = locDate.DayOfWeek.ToString();
            switch (dayName)
            {
                case "Monday":
                    w = 0;
                    break;
                case "Tuesday":
                    w = 1;
                    break;
                case "Wednesday":
                    w = 2;
                    break;
                case "Thursday":
                    w = 3;
                    break;
                case "Friday":
                    w = 4;
                    break;
                case "Saturday":
                    w = 5;
                    break;
                case "Sunday":
                    w = 6;
                    break;
            }
            int counter = 0;
            for (int i = w; i < daysEng.Length; i++)
            {
                if (daysEng[i] == daysEng[masNumber])
                {
                    DateTime dt = DateTime.Now.AddDays(counter);
                    return dt;
                }
                else
                    counter++;
                if (i == daysEng.Length - 1)
                    i = -1;
            }
            return locDate;
        }
    }
}